Оператор [timeout]

картинка

Описание

Счётчики и таймеры — неотъемлемая часть событийных процессов всякого микроэлектронного прибора. Оператор [timeout] позволяет организовать обратный отсчёт временного отрезка, заданного в секундах. На каждой итерации обработки правила оператор [timeout] будет возвращать в логический узел количество отсчитываемых секунд. Как только это значение достигнет нуля, [timeout] начнёт отсчёт сначала.

Пример применения

В примере ниже показан фрагмент правила, состоящий из двух узлов:

  • Узел N1_timeout — получает значение задержки из конфигурации устройства при помощи [load-ubus], а затем запускает таймер обратного отсчёта при помощи [timeout]
  • Узел N2_switch — запускает переключение GSM-модема на резервную SIM-карту, когда отсчёт времени достигнет нуля
Узел "N1_timeout"                                               -- Создаём узел для загрузки в него временного интервала с обратным отсчётом.
-----------------
N1_timeout = {
    {
        ["load-ubus"] = function (nodes)                        -- Загружаем значение временного интервала из конфигурации прибора
            return {                                            -- при помощи оператора ["load-ubus"]
                object = "uci",                                    
                method = "get",                                    
                params = {                                      -- Результат:
                    config = "tsmodem",                         -- {
                    section = "sim_0",                          --      "value": "180"
                    option = "timeout_reg",                     -- }
                }
            }
        end
    },
    {
        ["timeout"] = function(nodes)                           -- Запускаем обратный отсчёт времени: 180..179..178 и т.д. до нуля.
            return tonumber(nodes.timeout.value)                -- при помощи оператора ["timeout"].
        end
    },                                                          -- Теперь на каждой итерации обработки правил
},                                                              -- узел "N1_timeout" будет содержать количество секунд, уменьшаемое во времени.
 
Узел "N2_switch"
----------------
N2_switch = {                                                   -- Создаём узел, выполняющий переключение на резервную сим-карту.
    {
        ["skip"] = function (nodes)                             -- При помощи оператора ["skip"] проверяем не истекло ли время задержки.
            local stil_wait = (nodes.timeout.value > 0)         -- Если счётчик обратного отсчёта, хранимый в узле "N1_timeout", всё ещё больше нуля,
            return stil_wait                                    -- то пропускаем выполнение следующих операторов (load-ubus, frozen).
        end
    },
    {
        ["load-ubus"] = function (nodes)                        -- При помощи оператора ["load-ubus"] отправляем на системную шину команду "switch" -
            return {                                            -- т.е. - переключение на резервный слот сим-карты.
                object = "tsmstm",
                method = "switch",
            }
        end
    },
    {
        ["frozen"] = function (nodes)                           -- При помощи оператора ["frozen"] "замораживаем" узел на 30 секунд,
            return 30                                           -- предотвращая обработку данного узла на следующих итерациях.
        end                                                     -- Это даёт прибору время, необходимое для завершения процедуры переключения слотов.
    },
},

Как это работает

  • [timeout] получает начальное значение (в примере — 180 секунд из конфигурации)
  • На каждой итерации обработки правил значение уменьшается: 180 → 179 → 178 ... → 0
  • Когда значение достигает нуля, отсчёт начинается заново
  • Узел N2_switch проверяет ([skip]), не истекло ли время. Пока timeout.value > 0, переключение не происходит. При достижении нуля — выполняется load-ubus с командой switch